home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 25 / Cream of the Crop 25.iso / os2 / kzr0597.zip / ARTANH.CMD < prev    next >
OS/2 REXX Batch file  |  1997-03-10  |  3KB  |  96 lines

  1. /* REXX-Programm artanh.CMD  */
  2.  
  3.    Call RxFuncAdd 'SysLoadFuncs', RexxUtil, 'SysLoadFuncs'
  4.    Call SysLoadFuncs
  5.    Signal on syntax name artanhMsg
  6.  
  7. /* Diese Variablen müssen für jede Prozedur definiert werden, damit die  */
  8. /* Prozedur die Variable bufND kennt und die Variable ND übernehmen kann.*/
  9.    Pfd=SysSearchPath("PATH", "kzr.cmd")
  10.    lp=LastPos("\", Pfd)
  11.    Pfd=DelStr(Pfd, 1+lp)
  12.    NDAartanh=Pfd||"NDAartanh.DAT"
  13.    bufND  =Pfd||"NDZahl.DAT"
  14.    bufMsg =Pfd||"Meldung.DAT"
  15.    ND = LineIn(bufND, 1)
  16.  
  17.    if ND > 400 then
  18.    do
  19.      ND=400
  20.      call charout(NDAartanh) ; Call SysFileDelete NDAartanh
  21.      ret=LineOut(NDAartanh, 400)
  22.      Call Charout,"   Achtung, nur 400 Dezimalstellen bei der Berechnung von  artanh(...)"
  23.      say
  24.      Beep(444, 200); Beep(628,300)  /* Hier kein EXIT ! */
  25.    end
  26.  
  27.    /* Wenn ND <= 400 ist, wird ND = ND  weitergegeben */
  28.    call charout(NDAartanh) ; Call SysFileDelete NDAartanh
  29.    ret=LineOut(NDAartanh, ND)
  30.  
  31.    arg x,y  /* y soll "illegale" Komma's im Funktions-Argument aufspüren */
  32.    p0p=x*x  /* Diese Anweisung prvoziert eine Syntax-Fehlermeldung       */
  33.  
  34.    if length(y) > 0 then
  35.    do
  36.      call charout(NDAartanh); Call SysFileDelete NDAartanh
  37.      ret=LineOut(bufMsg, "Im Argument von  artanh(...)  ist mindestens  1  nicht zulässiges Komma !")
  38.      /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  39.      /*  damit in den diesbezüglichen temporären Dateien                      */
  40.      /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  41.      EXIT
  42.    end
  43.  
  44.    Numeric Digits ND+4
  45.  
  46.    if abs(x) = 1 then
  47.    do
  48.      call charout(NDAartanh); Call SysFileDelete NDAartanh
  49.      ret=LineOut(bufMsg, "Für  |x| = 1  ist  |artanh(x)| = unendlich groß !")
  50.      /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  51.      /*  damit in den diesbezüglichen temporären Dateien                      */
  52.      /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  53.      EXIT
  54.    end
  55.  
  56.    if abs(x) > 1 then
  57.    do
  58.      call charout(NDAartanh); Call SysFileDelete NDAartanh
  59.      ret=LineOut(bufMsg, "Für  |x| > 1  hat  artanh(x)  kein reelles Ergebnis !")
  60.      /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  61.      /*  damit in den diesbezüglichen temporären Dateien                      */
  62.      /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  63.      EXIT
  64.    end
  65.  
  66.    if abs(x) >  0.3 then Signal B
  67.  
  68. A: m=2; g=1; v=1; t=x*x
  69.    do forever
  70.      g=g*t*(m-1)/(m+1)
  71.      v=v+g
  72.      if g/v < 10**(-ND-4) then leave
  73.      m=m+2
  74.    end
  75.    y=x*v
  76.    Signal W
  77.  
  78. B: y=ln(sqrt((1+x)/(1-x)))
  79.  
  80.    /* Ausgabe */
  81. W: numeric digits ND
  82.    return(Format(y))
  83.  
  84. artanhMsg:
  85.    sf=ErrorText(RC)
  86.    if  Pos("Bad arithmetic conversion", sf) > 0 then
  87.    do
  88.      call charout(NDAartanh); Call SysFileDelete NDAartanh
  89.      ret=LineOut(bufMsg, "Sie haben in  artanh(...)  kein gültiges Argument eingegeben !")
  90.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  91.   /*  damit in den diesbezüglichen temporären Dateien                      */
  92.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  93.      EXIT
  94.    end
  95.  
  96.